
package com.loan.rebate.config;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import com.loan.rebate.common.SpringBeansTool;
import com.loan.rebate.config.dao.ConfigInfoDao;
import com.loan.rebate.config.param.ConfigInfoParam;
import com.loan.rebate.config.vo.ConfigInfoVO;

/**
 * 系统配置工具类
 *
 * @author 朱国军
 * @since 1.0
 * @version 2016年1月4日 朱国军
 */
@Component
@Scope("singleton")
public class ConfigUtils {
    
    private static Map<String, String> configMap = new HashMap<String, String>();
    
    private static Logger logger = LoggerFactory.getLogger(ConfigUtils.class);
    
    /**
     * 启动时初始化系统配置
     */
    public static void initConfig() {
        ConfigInfoDao configInfoDao = SpringBeansTool.context.getBean(ConfigInfoDao.class);
        int pageSize = 100;
        ConfigInfoParam param = new ConfigInfoParam();
        param.setPageSize(pageSize);
        param.setPageNo(1);

        Integer dataCount = configInfoDao.queryConfigCount(param);
        // 设置总记录数
        param.setDataCount(dataCount);
        // 设置总页码数
        Integer pageCount = dataCount % param.getPageSize() == 0 ? dataCount / param.getPageSize() : dataCount / param.getPageSize() + 1;
        param.setPageCount(pageCount);

        for (int i = 0; i < pageCount + 1; i++) {
            param.setPageNo(i + 1);
            param.setStartNum(i * param.getPageSize());
            List<ConfigInfoVO> dataList = configInfoDao.queryConfigList(param);
            for (ConfigInfoVO configInfo : dataList) {
                configMap.put(configInfo.getConfigKey(), configInfo.getConfigValue());
            }
        }
    }

    /**
     * 根据configKey更新对应的configValue
     *
     * @param configKey 配置项KEY
     * @param configValue 配置项VALUE
     */
    public static void updateConfigByKey(String configKey, String configValue) {
        configMap.put(configKey, configValue);
    }

    /**
     * 根据配置项KEY删除配置项
     *
     * @param configKey 配置项KEY
     */
    public static void deleteConfigByKey(String configKey) {
        if (configMap.containsKey(configKey)) {
            configMap.remove(configKey);
        }
    }

    /**
     * 根据KEY值获取String类型的配置值
     *
     * @param configKey 配置KEY
     * @return String的配置值
     */
    public static String getStringValueByKey(String configKey) {
        String value = configMap.get(configKey);
        if (StringUtils.isBlank(value)) {
            logger.error("根据 configKey：" + configKey + "找到的配置值为空，请检查该配置项！");
        }
        return value;
    }

    /**
     * 根据KEY值获取String类型的配置值
     *
     * @param configKey 配置KEY
     * @return String的配置值
     */
    public static Integer getIntegerValueByKey(String configKey) {
        String value = configMap.get(configKey);
        if (StringUtils.isBlank(value)) {
            logger.error("根据 configKey：" + configKey + "找到的配置值为空，请检查该配置项！");
            return null;
        } else {
            return Integer.valueOf(value);
        }
    }
    
    /**
     * 根据KEY值获取String类型的配置值
     *
     * @param configKey 配置KEY
     * @return String的配置值
     */
    public static Double getDoubleValueByKey(String configKey) {
        String value = configMap.get(configKey);
        if (StringUtils.isBlank(value)) {
            logger.error("根据 configKey：" + configKey + "找到的配置值为空，请检查该配置项！");
            return null;
        } else {
            return Double.valueOf(value);
        }
    }
    
    /**
     * 根据KEY值获取Long类型的配置值
     *
     * @param configKey 配置KEY
     * @return Long的配置值
     */
    public static Long getLongValueByKey(String configKey) {
        String value = configMap.get(configKey);
        if (StringUtils.isBlank(value)) {
            logger.error("根据 configKey：" + configKey + "找到的配置值为空，请检查该配置项！");
            return null;
        } else {
            return Long.valueOf(value);
        }
    }
    
    /**
     * 根据KEY值获取Boolean类型的配置值
     *
     * @param configKey 配置KEY
     * @return Boolean的配置值
     */
    public static Boolean getBooleanValueByKey(String configKey) {
        String value = configMap.get(configKey);
        if (StringUtils.isBlank(value)) {
            logger.error("根据 configKey：" + configKey + "找到的配置值为空，请检查该配置项！");
            return null;
        } else {
            return Boolean.valueOf(value);
        }
    }
}
